//
//  YSPUserAccount.swift
//  Weibo Demo
//
//  Created by 朴裕识 on 15/12/19.
//  Copyright © 2015年 Apple. All rights reserved.
//

import UIKit

class YSPUserAccount: NSObject, NSCoding {
    
    class var userLogin: Bool {
        //有帐号，返回true
        //没有帐号返回false
        return YSPUserAccount.loadUserAccount() != nil
    }
    
    //如果属性是可选类型，则可以在任意时候赋值
    var access_token: String?
    var uid: String?
    var expires_Date: NSDate?
    var expires_in: NSTimeInterval = 0 {
        didSet {
            expires_Date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    var screen_name: String?
    var avatar_large: String?
    
    //字典转模型
    init(dictionary: [String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dictionary)
    }
    
    //转模型时存在没有的key时会调用，什么也不用写
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
    //重写discription方法
    override var description: String {
        get {
            return "access_token: \(access_token), uid: \(uid), expires_in: \(expires_in), expires_Date: \(expires_Date)"
        }
    }
    
    //MARK: - 归档与反归档
    //归档
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expires_Date, forKey: "expires_Date")
        aCoder.encodeObject(screen_name, forKey: "screen_name")
        aCoder.encodeObject(avatar_large, forKey: "avatar_large")
    }
    
    //反归档
    required init?(coder aDecoder: NSCoder) {
        NSHomeDirectory()
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expires_Date = aDecoder.decodeObjectForKey("expires_Date") as? NSDate
        screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        avatar_large = aDecoder.decodeObjectForKey("avatar_large") as? String
    }
    
    //获取沙盒路径，拼接文件名
    static let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.plist")
    
    
    //MARK: - 存储用户数据
    func saveUserAccount() {
        //rootObject:要归档的对象
        //对象方法里访问static静态属性时要加类名
        NSKeyedArchiver.archiveRootObject(self, toFile: YSPUserAccount.path)
        
    }
    
    //每次程序一启动就会调用这个方法，都要去沙盒中拿帐号，消耗性能
    //干脆声明一个属性，当有可用帐号时，保存到属性中(即保存在内存中)，下次使用时，直接使用属性
    static var userAccount: YSPUserAccount?
    
    class func loadUserAccount() -> YSPUserAccount? {
        if (userAccount == nil) {
            //能来到这里说明内存里没有帐号
            //从沙盒反归档，并且保存到内存里
            userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? YSPUserAccount
        }
        
        //能到这里，说明内存里没有帐号，也尝试从沙盒反归档，但是也不一定有
        if userAccount != nil && userAccount?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            //能到这里来说明内存有帐号且帐号没过期
//            print("内存有帐号，而且没过期")
            return userAccount
        }
        
        //能来到这里说明要么没帐号，要么帐号过期
        return nil
    }
    
    //MARK: - 加载用户数据
    func loadUserInfo(finished: (error: NSError?) -> ()) {
        YSPNetworkTool.sharedNetworkTool.loadUserInfo { (result, error) -> () in
            
            if result == nil || error != nil {
                print("获取用户数据失败error = \(error)")
                finished(error: error)
                return
            }
            //能到这里来说明能获取用户数据
            let dictionary = result! as [String: AnyObject]
            self.screen_name = dictionary["screen_name"] as? String
            self.avatar_large = dictionary["avatar_large"] as? String
            
            //到了这里，这个userAccount对象更新了内容
            //先保存到沙盒
            self.saveUserAccount()
            
            YSPUserAccount.userAccount = self
            //由于上面已经更新了这个对象，就不用再写闭包传回调用方了
            finished(error: nil)
        }
    }
    
    
    
    
    //程序一开始没有帐号，要写成类方法，加个class
//    class func loadUserAccount() -> YSPUserAccount? {
//        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? YSPUserAccount {
//            //能到这里来说明能反归档出帐号
//            //NSDate()表示系统当前时间
//            //结果为降序，则过期时间大于当前时间，帐号还能用
//            if userAccount.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
//                print("成功加载帐号")
//                return userAccount
//            }
//            else {
//                print("帐号过期")
//            }
//        }
//        else {
//            print("没有可用的帐号")
//        }
//        return nil
//    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
}
